package com.shiyun.disaster_station.common;

import cn.hutool.core.collection.CollectionUtil;
import com.shiyun.disaster_station.enums.CacheEnum;
import com.shiyun.disaster_station.station.dao.StationMapper;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicReference;

/**
 * 类 描 述: 本地缓存
 * 作   者: 史 云
 * 版   本: 1.0.0
 * 时   间: 2022年01月11日  10:00:00
 */
@Component
public class LocalCacheUtil {
    @Resource
    StationMapper stationMapper;

    private static final Map<CacheEnum, ConcurrentMap<String, String>> CACHE_MAP = new ConcurrentHashMap<>(16);

    /**
     * 方法描述: 获取缓存数据
     * 作    者: 史 云
     * 时    间: 2022年05月17日  14:42:15
     */
    public String getData(CacheEnum group, String id,String tableName,String idKey,String valueName) {
        // 没有则先缓存一波
        if(!CACHE_MAP.containsKey(group)){
            fillCache(group,tableName,idKey,valueName);
        }
        // 有则直接取
        if (CACHE_MAP.containsKey(group)) {
            ConcurrentMap<String, String> groupMap = CACHE_MAP.get(group);
            if (groupMap.containsKey(id)) {
                return groupMap.get(id);
            }
            else {
                fillCache(group,tableName,idKey,valueName);
                return groupMap.get(id)==null?id : groupMap.get(id);
            }
        }
        return id;
    }

    /**
     * 方法描述: 获取缓存数据【id模糊匹配】
     * 作    者: 史 云
     * 时    间: 2022年05月17日  15:25:10
     */
    public String getLikeData(CacheEnum group, String id,String tableName,String idKey,String valueName){
        AtomicReference<String> value = new AtomicReference<>(getData(group, id, tableName, idKey, valueName));
        // 开始模糊匹配
        if(value.get().equals(id)){
            ConcurrentMap<String, String> groupMap = CACHE_MAP.get(group);
            groupMap.forEach((k,v)->{
                if(k.contains(id)){
                    value.set(v);
                }
            });
        }
        return value.get();
    }

    /**
     * 方法描述: 填充缓存数据
     * 作    者: 史 云
     * 时    间: 2022年05月17日  14:59:37
     */
    private void fillCache(CacheEnum group, String tableName,String idKey,String valueName){
        List<CacheBean> cacheBeanList = stationMapper.selectCacheList(tableName,idKey,valueName);
        if(CollectionUtil.isNotEmpty(cacheBeanList)){
            ConcurrentMap<String, String> groupMap = new ConcurrentHashMap<>(16);
            cacheBeanList.forEach(item->groupMap.put(item.getKey(),item.getValue()));
            CACHE_MAP.put(group,groupMap);
        }
    }

}
